<?php

@header('Content-Type: text/html; charset='.($encoding == 'UTF8' ? 'utf-8' : 'windows-1251'));

$adm_path=$adm_data_server."../";

include_once( $common_data_server."lib/php/vtmpl/vlibTemplate.php" );
include_once( $common_data_server."lib/php/vtmpl/vlibMimeMail.php" );
include_once( $common_data_server."lib/php/TDomXMLParserCL.php" );
include_once( $common_data_server."lib/php/filesystem.php" );
include_once( $common_data_server."lib/php/lib_array.php" );

include_once( "slashes.php" );

include_once($common_data_server."lib/php/resources_".(isset($db_type) ? $db_type : "mysql").".php");


// функция для формирования панели навигации по страницам
function page_navigation($lmt, $count, $var_name, $template, $excludeArr = array()){
// $lmt - кол-во записей на странице
// $count - общее кол-во записей
// $var_name - название переменной номера страницы
// $template - путь к шаблону

$tmpl = new vlibTemplate($template);

$tmp = array();
$query = $_SERVER["QUERY_STRING"];

foreach ($excludeArr as $key => $value){
	$query = preg_replace("/&?$value\d+=\w+/", '', $query);
}

if (isset($_SERVER["DOCUMENT_URI"] )){
	$script_name = $_SERVER["DOCUMENT_URI"];
}else{
	$script_name = $_SERVER["SCRIPT_NAME"];
}

$page = ( !((integer)$_GET[$var_name]) ? 1 : (integer)$_GET[$var_name] );
$page_in_url = ((!isset($_GET[$var_name]))?"":$_GET[$var_name]);

// удаление из QUERY_STRING параметра, содержащего номер страницы
$replace_str = $var_name."=".$page_in_url;
$query = str_replace("&".$replace_str, "", $query);
$query = ereg_replace("^".$replace_str."&?", "", $query);

if ($query != "")
	$query .= "&";

$query=preg_replace("/\\\['\"]/s","",$query);

$totalRecords = $count;
$pageSize = $lmt;
$CurrentPage = $page;

$leftover = ($totalRecords % $pageSize);

if ($leftover > 0){
    $TotalPage = ((($totalRecords - $leftover) / $pageSize) + 1);
}else{
    $TotalPage = $totalRecords / $pageSize;
}

$TotalPage = intval($TotalPage);
if ($TotalPage <= 1){
	return "";
}

if ($page > $TotalPage){
    $page = $TotalPage;
    $CurrentPage = $TotalPage;
}

$i=0;
$Lower1=0;
$Upper1 = 0;
$Lower2 = $CurrentPage;
$Upper2=0;
$LowerSpread = $CurrentPage - 1;
$UpperSpread = $TotalPage - $CurrentPage;
$ShowUpperEllipses = false;
$ShowLowerEllipses = false;

$LinkTemplate = $script_name."?".$query."$var_name=%%%";
$LinkEllipses =  $script_name."?".$query."$var_name=%%%";

if (($CurrentPage - 1) > 1){
     $Upper1 = $CurrentPage - 1;
}

if ($LowerSpread < 3){
    $Lower1 = $Upper1;
}else{
    if ($LowerSpread > 5){
        $Lower1 = $CurrentPage - 4;
        $ShowLowerEllipses = true;
    }else{
        $Lower1 = $CurrentPage - ($LowerSpread - 1);
    }
}

if (($CurrentPage + 1) < $TotalPage){
     $Lower2 = $CurrentPage + 1;
}
if ($UpperSpread < 3){
    $Upper2 = $Lower2;
}else{
    if ($UpperSpread > 5){
        $Upper2 = $CurrentPage + 4;
        $ShowUpperEllipses = true;
    }else{
        $Upper2 = $CurrentPage + ($UpperSpread - 1);
    }
}

$tmpl->newLoop('numbers');

if ($CurrentPage == 1){
	$tmp["number"] = 1;
	$tmp["is_current"]=1;
    $tmpl->addRow($tmp, 'numbers');
     //$out .= "1 ";
}else{
	$tmp["number"] = 1;
	$tmp["is_current"]=0;
	$tmp["number_url"] = str_replace("%%%", "1", $LinkTemplate);
    $tmpl->addRow($tmp, 'numbers');
}

if ($Lower1 > 0){
    if ($ShowLowerEllipses){
		$tmp["number"] = "...";
		$tmp["is_current"]=0;
		$tmp["number_url"] = str_replace("%%%", ($Lower1-1)."", $LinkEllipses);
	    $tmpl->addRow($tmp, 'numbers');
    }

    for ($i=$Lower1;$i<=$Upper1;$i++){
		$tmp["number"] = $i."";
		$tmp["is_current"]=0;
		$tmp["number_url"] = str_replace("%%%", $i."", $LinkTemplate);
	    $tmpl->addRow($tmp, 'numbers');
    }
}

if (($CurrentPage > 1) && ($CurrentPage != $TotalPage)){
	$tmp["number"] = $CurrentPage."";
	$tmp["is_current"]=1;
    $tmpl->addRow($tmp, 'numbers');
}

if (($Lower2 > 0) && ($Upper2 != $CurrentPage)){
     for ($i=$Lower2;$i<=$Upper2;$i++){
		$tmp["number"] = $i."";
		$tmp["is_current"]=0;
		$tmp["number_url"] = str_replace("%%%", $i."", $LinkTemplate);
	    $tmpl->addRow($tmp, 'numbers');
     }
     if ($ShowUpperEllipses){
 		$tmp["number"] = "...";
		$tmp["is_current"]=0;
		$tmp["number_url"] = str_replace("%%%", ($Upper2 + 1)."", $LinkEllipses);
	    $tmpl->addRow($tmp, 'numbers');
     }
}

if ($TotalPage > 1){

	if ($page != 1){
		$tmpl->setVar("prev", 1);
		$tmpl->setVar("prev_url", $script_name."?".$query."$var_name=" . ($page - 1));
		$tmpl->setVar("first", 1);
		$tmpl->setVar("first_url", $script_name."?".$query."$var_name=1");
	}else{
		$tmpl->setVar("prev_no", 1);
		$tmpl->setVar("first_no", 1);
	}

	if ($page != $TotalPage){
		$tmpl->setVar("next", 1);
		$tmpl->setVar("next_url", $script_name."?".$query."$var_name=" . ($page + 1));
		$tmpl->setVar("last", 1);
		$tmpl->setVar("last_url", $script_name."?".$query."$var_name=".$TotalPage);
	}else{
		$tmpl->setVar("next_no", 1);
		$tmpl->setVar("last_no", 1);
	}

    if ($CurrentPage == $TotalPage){
		$tmp["number"] = $TotalPage."";
		$tmp["is_current"]=1;
	    $tmpl->addRow($tmp, 'numbers');
    }else{
 		$tmp["number"] = $TotalPage."";
		$tmp["is_current"]=0;
		$tmp["number_url"] = str_replace("%%%", $TotalPage."", $LinkTemplate);
	    $tmpl->addRow($tmp, 'numbers');
    }
}

$tmpl->addLoop("numbers");

return($tmpl->grab());

}


// функция выдачи дерева записей в иерархическом виде
function get_tree($primary_field_name, $parent_id, $order_field='', $deep=0, $exclude=0, $sql='', $rs=''){
	global $desc_arr_for_get_tree,$gt_result_set;
	$desc_arr_for_get_tree=array();
	$gt_result_set=array();

	if($sql){
    	$table_set=sql_select($sql);
	}

	if(is_array($rs)){
		$table_set=$rs;
	}

	foreach($table_set as $k=>$ts){
		$table_set[$k]["_ORDER_"]=$ts[$order_field];
	}
    if($order_field)
        usort($table_set,"tree_item_compare");
    foreach($table_set as $ts){
		$desc_arr_for_get_tree[$ts["PARENT_ID"]][]=$ts;
	}

    build_get_tree($parent_id,$exclude,0,$primary_field_name,$order_field);

	return $gt_result_set;
}

// Вспомогательная рекурсивная функция для get_tree
function build_get_tree($parent_id,$exclude,$offset,$primary_field_name,$order_field){
	global $desc_arr_for_get_tree,$gt_result_set;
	if(is_array($desc_arr_for_get_tree[$parent_id])){
		foreach($desc_arr_for_get_tree[$parent_id] as $i_arr){
			if($i_arr[$primary_field_name]!=$exclude){
				$i_arr["TREE_DEEP"]=$offset;
				$gt_result_set[]=$i_arr;
				build_get_tree($i_arr[$primary_field_name],$exclude,$offset+1,$primary_field_name,$order_field);
			}
		}
	}
}
// функция сортировки записей по полю _ORDER_
function tree_item_compare ($a, $b){ // функция сортировки
   if ($a["_ORDER_"] == $b["_ORDER_"])
       return 0;
   return ($a["_ORDER_"] < $b["_ORDER_"]) ? -1 : 1;
}

// Упаовывает дату из отображаемого формата в ГГГГММДДЧЧММСС:
// из ДД.ММ.ГГГГ ЧЧ:ММ     - если $mode=="long"
// из ДД.ММ.ГГГГ           - если $mode=="short"
function pack_date($date,$mode){
    if($mode==1 || $mode=="long"){
		preg_match("/^(\d\d)\.(\d\d)\.(\d\d\d\d) (\d\d):(\d\d)$/",$date, $matches);
		$packed_date=$matches[3].$matches[2].$matches[1].$matches[4].$matches[5]."00";
	}
    if($mode==2 || $mode=="short"){
		preg_match("/^(\d\d)\.(\d\d)\.(\d\d\d\d)$/",$date, $matches);
		$packed_date=$matches[3].$matches[2].$matches[1]."000000";
	}
    if($matches[1]=="")
        return "error"; // Возвращает "error" если Preg не отматчил
    else
        return $packed_date;
}
// Распаковывает дату из формата ГГГГММДДЧЧММСС в отображаемый:
// ДД.ММ.ГГГГ ЧЧ:ММ     - если $mode=="full"
// ДД.ММ.ГГГГ           - если $mode=="short"
function unpack_date($packed_date,$mode){
	if(preg_match("/^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/",$packed_date,$matches)){
        if($mode==1 || $mode=="long")
            return $matches[3].".".$matches[2].".".$matches[1]." ".$matches[4].":".$matches[5];
        if($mode==2 || $mode=="short")
            return $matches[3].".".$matches[2].".".$matches[1];
    }
	return "";
}



//************************************************
// Функция аплоада файлов для контрола file. Функция немного отличается от той, что была в старом паблишинге
function do_upload_file( $prefix, $field_uploaddir){
    eval( 'global $_POST, $HTTP_POST_FILES, $' . $prefix . '_radio, $' . $prefix . '_url;' );
    global $common_htdocs_server,$common_htdocs_http, $encoding;
    $fs=new filesystem();

    $latin_equivalent = array(
		32 => '_',
		95 => '_',
		168 => 'YO',
		184 => 'yo',
		192 => 'A',
		193 => 'B',
		194 => 'V',
		195 => 'G',
		196 => 'D',
		197 => 'E',
		198 => 'ZH',
		199 => 'Z',
		200 => 'I',
		201 => 'Y',
		202 => 'K',
		203 => 'L',
		204 => 'M',
		205 => 'N',
		206 => 'O',
		207 => 'P',
		208 => 'R',
		209 => 'S',
		210 => 'T',
		211 => 'U',
		212 => 'F',
		213 => 'KH',
		214 => 'TS',
		215 => 'CH',
		216 => 'SH',
		217 => 'SHCH',
		218 => '',
		219 => 'Y',
		220 => '',
		221 => 'E',
		222 => 'U',
		223 => 'YA',
		224 => 'a',
		225 => 'b',
		226 => 'v',
		227 => 'g',
		228 => 'd',
		229 => 'e',
		230 => 'zh',
		231 => 'z',
		232 => 'i',
		233 => 'y',
		234 => 'k',
		235 => 'l',
		236 => 'm',
		237 => 'n',
		238 => 'o',
		239 => 'p',
		240 => 'r',
		241 => 's',
		242 => 't',
		243 => 'u',
		244 => 'f',
		245 => 'kh',
		246 => 'ts',
		247 => 'ch',
		248 => 'sh',
		249 => 'shch',
		250 => '',
		251 => 'y',
		252 => '',
		253 => 'e',
		254 => 'u',
		255 => 'ya',
		185 => 'N'
	);
	$i = 0;
	$suitable_filename = '';
	if( !$field_uploaddir )
		$field_uploaddir = 'img/uploaded/';//$uploadpath;
	$original_filename = $HTTP_POST_FILES[ $prefix . '_file' ][ 'name' ];
    if(preg_match("/^\./",$original_filename))
        $original_filename="";// Глушить htaccess'ы
	if( $original_filename ){
		$temporary_filename = $HTTP_POST_FILES[ $prefix . '_file' ][ 'tmp_name' ];
		if( is_uploaded_file( $temporary_filename ) ){
			$i = strrpos( $original_filename, '.' );
			$extension = ( $i != FALSE ) ? substr( $original_filename, $i ) : '.ext';
			$original_filename = substr( $original_filename, 0, $i );

			// start: converting filename from utf-8 to cp1251 in utf-projects
			if ( $encoding == "UTF8" ){
				if ( ( $enc_str = iconv( 'UTF-8', 'CP1251', $original_filename ) ) !== false ){
					$original_filename = $enc_str;
					unset( $enc_str );
				}
			}
			// end: converting filename from utf-8 to cp1251 in utf-projects / added by ak76

			for( $i = 0; $i < strlen( $original_filename ); $i++ ){
				if( array_key_exists( ord( $original_filename[ $i ]), $latin_equivalent ) ){
					$suitable_filename .= $latin_equivalent[ ord( $original_filename[ $i ] ) ];
				}else{
					$suitable_filename .= $original_filename[ $i ];
				}
			}
			$i = -1;
			while( true ){
				if( $i == -1 && !( file_exists( $common_htdocs_server . $field_uploaddir . $suitable_filename . $extension ) ) )
					break;
				if( $i >= 0 && !( file_exists( $common_htdocs_server . $field_uploaddir . $suitable_filename . '-' . $i . $extension ) ) )
					break;
				$i++;
			}
	        $http_suitable_filename=$common_htdocs_http . $field_uploaddir . $suitable_filename . ( $i >= 0 ? '-' . $i : '' ) . $extension;
			$suitable_filename = $field_uploaddir . $suitable_filename . ( $i >= 0 ? '-' . $i : '' ) . $extension;
			chmod( $temporary_filename, 0666 );
			$fs->mkdir_r($common_htdocs_server.$field_uploaddir, 0777);
			Copy($temporary_filename,$common_htdocs_server.$suitable_filename);
			return($http_suitable_filename);
		}else{
			die( 'a file \'' . $temporary_filename . '\' couldn\'t be uploaded.' );
		}
	}else{
		eval( '$suitable_filename = $_POST["' . $prefix . '_url"];' );
		return( $suitable_filename );
	}
}

// Посылает почту в кодировке КОИ8-Р
//$to_address	- почтовый адрес принимателя
//$to_name		- имя принимателя
//$from_address	- почтовый адрес отправителя
//$from_name	- имя отправителя
//$subject		- сабжект
//$message		- сообщение
//$from_encode	- исходная кодировка (обычно "w" - виндовая)
//$to_encode	- конечная кодировка (обычно "k" - КОИ)
function post_mail($to_address,$to_name,$from_address,$from_name,$subject,$message,$from_encode="w",$to_encode="k"){
	global $os_type, $encoding;
	$email = new vlibMimeMail;

	$recipient["ENCODING"]=1;

	if (isset($os_type) && $os_type == "windows"){
		$_ENCODING_[$recipient["ENCODING"]]='WINDOWS-1251';
		// шлепаем e-mail получателя
		$email->to($to_address);
		// шлепаем e-mail отправителя
		$email->from($from_address);
		// шлепаем тему письма
		$email->subject($subject);
		// шлепаем тело письма
		$email->HTMLBody($message, strtolower($_ENCODING_[$recipient["ENCODING"]]));
	}elseif (isset($encoding) && $encoding == 'UTF8'){
		$_ENCODING_[$recipient["ENCODING"]]='UTF-8';
		// шлепаем e-mail получателя
		$email->to($to_address, "=?UTF-8?B?".base64_encode($to_name)."?=");
		// шлепаем e-mail отправителя
		$email->from($from_address, "=?UTF-8?B?".base64_encode($from_name)."?=");
		// шлепаем тему письма
		$email->subject("=?UTF-8?B?".base64_encode($subject)."?=");
		// шлепаем тело письма
		$email->HTMLBody($message, strtolower($_ENCODING_[$recipient["ENCODING"]]));
	}else{
		$_ENCODING_[$recipient["ENCODING"]]='KOI8-R';
		// шлепаем e-mail получателя
		$email->to($to_address, "=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'CP1251')."?B?".base64_encode(convert_cyr_string($to_name, 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");
		// шлепаем e-mail отправителя
		$email->from($from_address, "=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'CP1251')."?B?".base64_encode(convert_cyr_string($from_name, 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");
		// шлепаем тему письма
		$email->subject("=?".($recipient["ENCODING"] == 1 ? 'KOI8-R' : 'CP1251')."?B?".base64_encode(convert_cyr_string($subject, 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]))."?=");
		// шлепаем тело письма
		$email->HTMLBody(convert_cyr_string($message, 'WINDOWS-1251', $_ENCODING_[$recipient["ENCODING"]]), strtolower($_ENCODING_[$recipient["ENCODING"]]));
	}
	// отправляем письмо
	$email->send();
}

// Функция для подсчета времени работы кода
// $label - метка отсчета
// $precision - точность в знаках после запятой
// Функция возвращает разность времени в секундах между предыдущим отсчетом и текущим моментом времени
// и устанавливает отсчет переданной метки на текущее время
function bencher($label,$precision=4){
	static $label_arr;
	$cur_time=microtime();

	preg_match("/(\.\d+) (\d+)/",$cur_time,$matches);
	$end=$matches[2].$matches[1];
	preg_match("/(\.\d+) (\d+)/",$label_arr[$label],$matches);
	$start=$matches[2].$matches[1];

	$label_arr[$label]=$cur_time;
	return sprintf("%1.{$precision}f",$end-$start);
}


#----------------------------------------------------------------------------------

# Функция преобразует имена с префиксом ( _nonempty_ и т.д. ) в актуальные имена.
# Используется для предотвращения не получения данных с выключенным JavaScript
# $data_mass - ассоциативный массив $_GET, $_POST или $this->q_param

function GetFormJSField( $data_mass, $end_name ){
    $res = '';
    if ( is_array($data_mass) ){
		$keys = array_keys($data_mass);
		$index = sizeof($keys);
		for($i=0; $i<$index; $i++){
			if( preg_match( '/(^'.$end_name.'$)|(_'.$end_name.'$)/', $keys[$i] ) ){
				$res = $data_mass[$keys[$i]];
				break;
			}
		}
		unset($keys);
	}
	return $res;
}

#-------------------------------------------------------------------------------------------------------------------------

# Функция принимает ассоциативный массив $vars и передает их в шаблон $fname,
# возвращает шаблон, заполненный данными.
# $fname - абсолютный путь до шаблона
# $vars['ИМЯ_ПЕРЕМЕННОЙ'] = ЗНАЧЕНИЕ_ПЕРЕМЕННОЙ; для значений массивов,
# автоматически делается setLoop в противном случае setVar.

function ParseTemplate( $fname, $vars = array() ){
    $res = '';
	if( file_exists($fname) ){
        $tmpl = & new vlibTemplate($fname);
        if ( is_array($vars) ){
            $keys = array_keys($vars);
	        $index = sizeof($keys);
			for($i=0; $i<$index; $i++){
				$name = trim($keys[$i]);
                if (  ( $name != '') && ( is_array( $vars[$keys[$i]] ) ) ){
				    $tmpl->setLoop( $name, $vars[$keys[$i]] );
				}elseif ( $name != '' ){
					$tmpl->setVar( $name, $vars[$keys[$i]] );
				}
                unset($name);
			}
        }
		$res = $tmpl->grab();
		unset($tmpl);
	}else{		$res = "<br><font color='RED'>ERROR: Can't find template file: ".$fname."</font><br>";
	}
    return $res;
}

#-------------------------------------------------------------------------------------------------------------------------

# Функция принимает массив $mass - db record set,
# и ключ, по которому строиться строка чисел через запятую, для запросов с IN
# если ключ не указан, предполагается что массив простой

function MakeIN( &$mass, $key = '' ){
	$res = '';
	$buf_arr = array();
	if ( !empty($mass) ){
		$index = sizeof($mass);
		for($i=0; $i<$index; $i++){
			$buf = $key ? intval($mass[$i][$key]) : intval($mass[$i]);
			if ( $buf ) $buf_arr[] = $buf;
		}
		if ( !empty($buf_arr) ){
			$res = implode(', ', $buf_arr);
			unset($buf_arr);
		}
	}
	if ( !$res ) $res = '0';
	return $res;
}

#-------------------------------------------------------------------------------------------------------------------------

?>